function [ cost ] = cost( graph, coloring )
%COST Funkcja kosztu

    cost = 0;
    % Liczenie kolorów pomalowanych na kolor i
    [cntr uniqueColors] = hist(coloring, unique(coloring));
% Chyba hist jest szybsze od tego:
%     uniqueColors = unique(coloring);
%     cntr = zeros(numel(uniqueColors));
%     for i = 1:numel(uniqueColors)
%         elem = uniqueColors(i);
%         cntr(i) = sum(coloring == elem);
%     end
    
    % Liczenie złych krawędzi w każdym kolorze.
    cntrEdges = zeros(numel(uniqueColors));
    
    [rows,cols] = find(graph>0);
    e = zeros(numel(uniqueColors), 1);
% Wersja 1:
% to jest 2 razy szybsze od v2!
%Próbujemy to przyspieszyć:
    s = size(graph, 1);
    for i = 1:s
        for j = i+1:s
            if graph(i,j) == 1  % jest krawędź
                if coloring(i) == coloring(j)
                    for k=1:numel(uniqueColors)
                        if coloring(i) == uniqueColors(k)
                            e(k) = e(k) + 1;
                        end
                    end
                end
            end
        end
    end
    
% Wersja 2:
%     s = size(rows, 1);
%     for z = 1:s
%         i = rows(z);
%         j = cols(z);
%                 if coloring(i) == coloring(j)
%                     for k=1:numel(uniqueColors)
%                         if coloring(i) == uniqueColors(k)
%                             e(k) = e(k) + 1;
%                         end
%                     end
%                 end
%     end
%     e = e./2;

    % SUMA = (liczba kolorów pomalowanych na i)^2 +
    %      + 2 * (liczba kolorów pomalowanych na i) * liczba błędnych
    %                                          krawędzi w tym kolorze
    for i = 1:numel(uniqueColors)
        cost = cost - power(cntr(i), 2) + 2 * cntr(i) * e(i);
    end
end
